package com.example.roleplay.domain;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * 会话记忆实体
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SessionMemory {
    
    /**
     * 会话ID
     */
    private String sessionId;
    
    /**
     * 角色ID
     */
    private String personaId;
    
    /**
     * 用户ID（可选）
     */
    private String userId;
    
    /**
     * 会话创建时间
     */
    private LocalDateTime createdAt;
    
    /**
     * 最后活跃时间
     */
    private LocalDateTime lastActiveAt;
    
    /**
     * 对话历史记录
     */
    @Builder.Default
    private List<ConversationTurn> conversationHistory = new ArrayList<>();
    
    /**
     * 用户偏好和关键信息
     */
    private UserProfile userProfile;
    
    /**
     * 会话状态
     */
    @Builder.Default
    private SessionStatus status = SessionStatus.ACTIVE;

    /**
     * 对话轮次内部类
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class ConversationTurn {
        /**
         * 轮次序号
         */
        private int turnNumber;
        
        /**
         * 用户消息
         */
        private String userMessage;
        
        /**
         * 助手回复
         */
        private String assistantMessage;
        
        /**
         * 消息时间戳
         */
        private LocalDateTime timestamp;
        
        /**
         * 消息类型（文本/语音）
         */
        private MessageType messageType;
        
        /**
         * 使用的技能
         */
        private List<Skill> skillsUsed;
    }

    /**
     * 用户画像内部类
     */
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public static class UserProfile {
        /**
         * 用户姓名或昵称
         */
        private String name;
        
        /**
         * 用户偏好的语言
         */
        private String preferredLanguage;
        
        /**
         * 用户兴趣话题
         */
        private List<String> interests;
        
        /**
         * 用户的沟通风格偏好
         */
        private String communicationStyle;
        
        /**
         * 用户提到的重要信息
         */
        private List<String> keyInformation;
    }

    /**
     * 消息类型枚举
     */
    public enum MessageType {
        TEXT, VOICE
    }

    /**
     * 会话状态枚举
     */
    public enum SessionStatus {
        ACTIVE, PAUSED, ENDED, EXPIRED
    }

    /**
     * 添加新的对话轮次
     */
    public void addConversationTurn(String userMessage, String assistantMessage, MessageType messageType, List<Skill> skillsUsed) {
        ConversationTurn turn = ConversationTurn.builder()
                .turnNumber(conversationHistory.size() + 1)
                .userMessage(userMessage)
                .assistantMessage(assistantMessage)
                .timestamp(LocalDateTime.now())
                .messageType(messageType)
                .skillsUsed(skillsUsed != null ? skillsUsed : new ArrayList<>())
                .build();
        
        conversationHistory.add(turn);
        this.lastActiveAt = LocalDateTime.now();
        
        // 限制历史记录长度，保留最近的轮次
        int maxTurns = 10; // 可以从配置读取
        if (conversationHistory.size() > maxTurns) {
            conversationHistory = conversationHistory.subList(
                conversationHistory.size() - maxTurns, 
                conversationHistory.size()
            );
        }
    }

    /**
     * 获取最近的用户消息
     */
    public String getLastUserMessage() {
        if (conversationHistory.isEmpty()) {
            return null;
        }
        return conversationHistory.get(conversationHistory.size() - 1).getUserMessage();
    }

    /**
     * 获取最近的助手回复
     */
    public String getLastAssistantMessage() {
        if (conversationHistory.isEmpty()) {
            return null;
        }
        return conversationHistory.get(conversationHistory.size() - 1).getAssistantMessage();
    }

    /**
     * 更新最后活跃时间
     */
    public void updateLastActiveTime() {
        this.lastActiveAt = LocalDateTime.now();
    }

    /**
     * 检查会话是否过期
     */
    public boolean isExpired(int timeoutMinutes) {
        if (lastActiveAt == null) {
            return false;
        }
        return lastActiveAt.isBefore(LocalDateTime.now().minusMinutes(timeoutMinutes));
    }
}